package com.timestored.misc;
/*
 * qStudio - Free SQL Analysis Tool
 * Copyright C 2013-2024 TimeStored
 *
 * Licensed under the Apache License, Version 2.0 the "License";
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.awt.Color;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * Utility methods for parsing color strings in CSS-like formats.
 * Supports:
 *
 *   - Named colors: "red", "blue", "lightgray", "rebeccapurple"
 *   - Hex: "#RGB", "#RRGGBB", "#RRGGBBAA"
 *   - rgb(r,g,b)
 *   - rgba(r,g,b,a)
 *
 * Fallback defaults to {@code Color.BLACK}.
 */
public final class ColorUtils {

    private ColorUtils() {}

    /** CSS named colors (HTML standard 147 color names). */
    private static final Map<String, Color> NAMED_COLORS;

    static {
        Map<String, Color> m = new HashMap<>();

        // Standard CSS/HTML color names:
        m.put("black", new Color(0x000000));
        m.put("white", new Color(0xFFFFFF));
        m.put("red",   new Color(0xFF0000));
        m.put("green", new Color(0x008000));
        m.put("blue",  new Color(0x0000FF));
        m.put("cyan",  new Color(0x00FFFF));
        m.put("magenta", new Color(0xFF00FF));
        m.put("yellow", new Color(0xFFFF00));
        m.put("gray", new Color(0x808080));
        m.put("grey", new Color(0x808080));

        // Full named CSS color list:
        String[][] css = {
                {"aliceblue","F0F8FF"}, {"antiquewhite","FAEBD7"}, {"aqua","00FFFF"},
                {"aquamarine","7FFFD4"}, {"azure","F0FFFF"}, {"beige","F5F5DC"},
                {"bisque","FFE4C4"}, {"blanchedalmond","FFEBCD"}, {"blueviolet","8A2BE2"},
                {"brown","A52A2A"}, {"burlywood","DEB887"}, {"cadetblue","5F9EA0"},
                {"chartreuse","7FFF00"}, {"chocolate","D2691E"}, {"coral","FF7F50"},
                {"cornflowerblue","6495ED"}, {"cornsilk","FFF8DC"}, {"crimson","DC143C"},
                {"darkblue","00008B"}, {"darkcyan","008B8B"}, {"darkgoldenrod","B8860B"},
                {"darkgray","A9A9A9"}, {"darkgrey","A9A9A9"}, {"darkgreen","006400"},
                {"darkkhaki","BDB76B"}, {"darkmagenta","8B008B"}, {"darkolivegreen","556B2F"},
                {"darkorange","FF8C00"}, {"darkorchid","9932CC"}, {"darkred","8B0000"},
                {"darksalmon","E9967A"}, {"darkseagreen","8FBC8F"}, {"darkslateblue","483D8B"},
                {"darkslategray","2F4F4F"}, {"darkslategrey","2F4F4F"}, {"darkturquoise","00CED1"},
                {"darkviolet","9400D3"}, {"deeppink","FF1493"}, {"deepskyblue","00BFFF"},
                {"dimgray","696969"}, {"dimgrey","696969"}, {"dodgerblue","1E90FF"},
                {"firebrick","B22222"}, {"floralwhite","FFFAF0"}, {"forestgreen","228B22"},
                {"fuchsia","FF00FF"}, {"gainsboro","DCDCDC"}, {"ghostwhite","F8F8FF"},
                {"gold","FFD700"}, {"goldenrod","DAA520"}, {"greenyellow","ADFF2F"},
                {"honeydew","F0FFF0"}, {"hotpink","FF69B4"}, {"indianred","CD5C5C"},
                {"indigo","4B0082"}, {"ivory","FFFFF0"}, {"khaki","F0E68C"},
                {"lavender","E6E6FA"}, {"lavenderblush","FFF0F5"}, {"lawngreen","7CFC00"},
                {"lemonchiffon","FFFACD"}, {"lightblue","ADD8E6"}, {"lightcoral","F08080"},
                {"lightcyan","E0FFFF"}, {"lightgoldenrodyellow","FAFAD2"}, {"lightgray","D3D3D3"},
                {"lightgrey","D3D3D3"}, {"lightgreen","90EE90"}, {"lightpink","FFB6C1"},
                {"lightsalmon","FFA07A"}, {"lightseagreen","20B2AA"}, {"lightskyblue","87CEFA"},
                {"lightslategray","778899"}, {"lightslategrey","778899"}, {"lightsteelblue","B0C4DE"},
                {"lightyellow","FFFFE0"}, {"lime","00FF00"}, {"limegreen","32CD32"},
                {"linen","FAF0E6"}, {"maroon","800000"}, {"mediumaquamarine","66CDAA"},
                {"mediumblue","0000CD"}, {"mediumorchid","BA55D3"}, {"mediumpurple","9370DB"},
                {"mediumseagreen","3CB371"}, {"mediumslateblue","7B68EE"}, {"mediumspringgreen","00FA9A"},
                {"mediumturquoise","48D1CC"}, {"mediumvioletred","C71585"}, {"midnightblue","191970"},
                {"mintcream","F5FFFA"}, {"mistyrose","FFE4E1"}, {"moccasin","FFE4B5"},
                {"navajowhite","FFDEAD"}, {"navy","000080"}, {"oldlace","FDF5E6"},
                {"olive","808000"}, {"olivedrab","6B8E23"}, {"orange","FFA500"},
                {"orangered","FF4500"}, {"orchid","DA70D6"}, {"palegoldenrod","EEE8AA"},
                {"palegreen","98FB98"}, {"paleturquoise","AFEEEE"}, {"palevioletred","DB7093"},
                {"papayawhip","FFEFD5"}, {"peachpuff","FFDAB9"}, {"peru","CD853F"},
                {"pink","FFC0CB"}, {"plum","DDA0DD"}, {"powderblue","B0E0E6"},
                {"purple","800080"}, {"rebeccapurple","663399"}, {"rosybrown","BC8F8F"},
                {"royalblue","4169E1"}, {"saddlebrown","8B4513"}, {"salmon","FA8072"},
                {"sandybrown","F4A460"}, {"seagreen","2E8B57"}, {"seashell","FFF5EE"},
                {"sienna","A0522D"}, {"silver","C0C0C0"}, {"skyblue","87CEEB"},
                {"slateblue","6A5ACD"}, {"slategray","708090"}, {"slategrey","708090"},
                {"snow","FFFAFA"}, {"springgreen","00FF7F"}, {"steelblue","4682B4"},
                {"tan","D2B48C"}, {"teal","008080"}, {"thistle","D8BFD8"},
                {"tomato","FF6347"}, {"turquoise","40E0D0"}, {"violet","EE82EE"},
                {"wheat","F5DEB3"}, {"whitesmoke","F5F5F5"}, {"yellowgreen","9ACD32"}
        };

        for (String[] e : css) {
            m.put(e[0].toLowerCase(), new Color(Integer.parseInt(e[1], 16)));
        }

        NAMED_COLORS = Collections.unmodifiableMap(m);
    }

    /**
     * Parse a CSS-like color string.
     */
    public static Color parse(String raw) {
        if (raw == null) {
            return Color.BLACK;
        }
        raw = raw.trim().toLowerCase();
        if (raw.isEmpty()) {
            return Color.BLACK;
        }

        // Named colors
        Color named = NAMED_COLORS.get(raw);
        if (named != null) {
            return named;
        }

        // #RGB, #RRGGBB, #RRGGBBAA
        if (raw.startsWith("#")) {
            try {
                int hex = Integer.decode(raw);
                if (raw.length() == 9) {  // #AARRGGBB
                    return new Color(hex, true);
                }
                return new Color(hex);
            } catch (Exception ignored) {}
        }

        // rgb(r,g,b)
        if (raw.startsWith("rgb(") && raw.endsWith(")")) {
            try {
                String[] p = raw.substring(4, raw.length() - 1).split(",");
                int r = Integer.parseInt(p[0].trim());
                int g = Integer.parseInt(p[1].trim());
                int b = Integer.parseInt(p[2].trim());
                return new Color(r, g, b);
            } catch (Exception ignored) {}
        }

        // rgba(r,g,b,a)
        if (raw.startsWith("rgba(") && raw.endsWith(")")) {
            try {
                String[] p = raw.substring(5, raw.length() - 1).split(",");
                int r = Integer.parseInt(p[0].trim());
                int g = Integer.parseInt(p[1].trim());
                int b = Integer.parseInt(p[2].trim());
                float a = Float.parseFloat(p[3].trim());
                return new Color(r, g, b, (int)(a * 255));
            } catch (Exception ignored) {}
        }

        return Color.BLACK;
    }
}
